/**
 * Promise.all()
 * 1. Promise.all 用于并行处理多个 Promise，并在所有 Promise 都成功时返回结果数组。
 * 2. 如果任何一个 Promise 失败，则整个 Promise.all 会立即失败，并返回该失败的原因。
 * 3. 接受一个 Promise 对象的数组，返回一个新的 Promise。
 * 4. 当所有的 Promise 都被解决时，返回的 Promise 状态为 fulfilled，否则返回rejected
 */



// Promise.all()示例
// 模拟异步获取用户信息
function getUserInfo(userId: number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('获取用户信息');
      resolve({ userId, name: 'John Doe' });
    }, 1000);
  });
}

// 模拟异步获取订单信息
function getOrderInfo(orderId: number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('获取订单信息');
      resolve({ orderId, total: 100 });
    }, 1500);
  });
}

// 模拟异步获取产品信息
function getProductInfo(productId: number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('获取产品信息');
      resolve({ productId, name: 'Laptop' });
    }, 2000);
  });
}

// 使用 Promise.all 并行处理
const userId = 1;
const orderId = 101;
const productId = 202;

Promise.all([
  getUserInfo(userId),
  getOrderInfo(orderId),
  getProductInfo(productId)
])
  .then((results) => {
    const [userInfo, orderInfo, productInfo] = results;
    console.log('用户信息:', userInfo);
    console.log('订单信息:', orderInfo);
    console.log('产品信息:', productInfo);
  })
  .catch((error) => {
    console.error('获取信息失败:', error);
  });

// 获取用户信息
// 获取订单信息
// 获取产品信息
// 用户信息: { userId: 1, name: 'John Doe' }
// 订单信息: { orderId: 101, total: 100 }
// 产品信息: { productId: 202, name: 'Laptop' }


/**
 * Promise.race()
 * 1. Promise.race 用于竞争处理多个 Promise
 * 2. 接受一个 Promise 对象的数组，返回一个新的 Promise。
 * 3. 当第一个 Promise 被解决或被拒绝，则返回的 Promise 状态为 fulfilled 或 rejected，并将该值传递给回调函数。
 */


// Promise.race()示例
// 模拟从服务器1获取数据
function fetchFromServer1() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('从服务器1获取数据');
      resolve({ server: 1, data: 'Server 1 Data' });
    }, 3000); // 模拟服务器1响应时间为3秒
  });
}

// 模拟从服务器2获取数据
function fetchFromServer2() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('从服务器2获取数据');
      resolve({ server: 2, data: 'Server 2 Data' });
    }, 2000); // 模拟服务器2响应时间为2秒
  });
}

// 模拟从服务器3获取数据
function fetchFromServer3() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('从服务器3获取数据');
      resolve({ server: 3, data: 'Server 3 Data' });
    }, 1000); // 模拟服务器3响应时间为1秒
  });
}


// 使用 Promise.race 竞争处理
Promise.race([
  fetchFromServer1(),
  fetchFromServer2(),
  fetchFromServer3()
])
  .then((result) => {
    console.log('最快响应的数据:', result);
  })
  .catch((error) => {
    console.error('获取数据失败:', error);
  });
  // 从服务器3获取数据
  // 最快响应的数据: { server: 3, data: 'Server 3 Data' }
  // 从服务器2获取数据
  // 从服务器1获取数据